#ifndef IMAGEPREVIEWWIDGET_H
#define IMAGEPREVIEWWIDGET_H

#include <QWidget>
#include <QUuid>
#include <QDebug>
#include <QImage>
#include <QString>
#include <QMap>
#include <QKeyEvent>
#include <QButtonGroup>
#include "ImageCacheManager.h"
class PreviewItem;

QT_BEGIN_NAMESPACE
namespace Ui { class ImagePreviewWidget; }
QT_END_NAMESPACE

class ImagePreviewWidget : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数，初始化图像预览窗口
     * @param parent 父窗口指针
     */
    ImagePreviewWidget(QWidget *parent = nullptr);
    
    /**
     * @brief 析构函数，释放资源
     */
    ~ImagePreviewWidget();

    /**
     * @brief 添加图像到缓存
     * @param newImage 要添加的图像
     * @return 图像的唯一标识GUID
     */
    QString addImage(const QImage &newImage);
    
    /**
     * @brief 从文件加载图像
     * @param filePath 图像文件路径
     * @return 图像的唯一标识GUID
     */
    QString loadImageFromFile(const QString &filePath);
    
    /**
     * @brief 获取指定GUID的图像
     * @param imageGuid 图像唯一标识
     * @return 图像对象
     */
    QImage getImage(const QString &imageGuid) const;
    
    /**
     * @brief 获取缓存管理器指针
     * @return 缓存管理器指针
     */
    ImageCacheManager* getCacheManager() const;
    
    /**
     * @brief 设置缓存管理器指针
     * @param cacheManager 缓存管理器指针
     * @details 用于从外部注入缓存管理器实例，ImagePreviewWidget不负责其生命周期
     */
    void setCacheManager(ImageCacheManager* cacheManager);
    
    /**
     * @brief 设置选中的图像GUID
     * @param guid 要选中的图像唯一标识
     * @details 此方法用于编程方式设置选中的图像，不会触发点击事件信号
     */
    void setSelectedImageGuid(const QString &guid);
    
    /**
     * @brief 获取当前选中的图像GUID
     * @return 当前选中图像的唯一标识
     */
    QString getCurrentSelectedGuid() const;
    

  signals:
    /**
     * @brief 当需要向显示插件注册图像时发出的信号
     * @param imageGuid 图像唯一标识
     */
    void requestRegisterImageDisplay(const QString &imageGuid);
    
    /**
     * @brief 当预览项被点击时发出的信号，用于切换显示指定图像
     * @param imageGuid 要显示的图像GUID
     */
    void displayImageRequested(const QString &imageGuid);
    
    /**
     * @brief 请求切换到指定图形显示窗口的信号
     * @param imageGuid 图像唯一标识
     */
    void switchToPreviewItem(const QString &imageGuid);
    
    /**
     * @brief 当预览项被删除时发出的信号
     * @param imageGuid 被删除的图像GUID
     */
    void PreviewItemDelete(const QString &imageGuid);
    
    /**
     * @brief 请求撤销操作的信号
     * @param imageGuid 当前选中图像的GUID
     */
    void undoRequested(const QString &imageGuid);
    
    /**
     * @brief 请求重做操作的信号
     * @param imageGuid 当前选中图像的GUID
     */
    void redoRequested(const QString &imageGuid);

public slots:
    /**
     * @brief 加载图像按钮点击槽
     */
    void handleLoadingButtonClick();
    
    /**
     * @brief 保存图像按钮点击槽
     */
    void handleSaveButtonClick();
    /**
     * @brief 处理缓存中移除图像的信号
     * @param imageGuid 图像唯一标识
     */
    void onImageRemoved(const QString &imageGuid);
private slots:
    /**
     * @brief 处理缓存中添加图像的信号
     * @param imageGuid 图像唯一标识
     */
    void onImageAdded(const QString &imageGuid);
    /**
     * @brief 处理缓存中图像更新的信号
     * @param imageGuid 图像唯一标识
     */
    void onImageUpdated(const QString &imageGuid);
    /**
     * @brief 处理预览项点击事件
     * @param guid 图像唯一标识
     */
    void onPreviewItemClicked(const QString &guid);

protected:
    /**
     * @brief 处理键盘按键事件
     * @param event 键盘事件对象
     */
    void keyPressEvent(QKeyEvent *event) override;
    
private:
    /**
     * @brief 更新预览区域显示
     * 重新排列和显示所有预览项
     */
    void updatePreviewArea();
private:
    Ui::ImagePreviewWidget *ui;
    ImageCacheManager *m_cacheManager; // 图像缓存管理器指针（非拥有者）
    QMap<QString, PreviewItem*> m_previewItems; // 存储GUID到PreviewItem的映射
    QString m_currentSelectedGuid; // 当前选中的图像GUID
    QButtonGroup *m_buttonGroup; // 互斥按钮组，用于管理预览项的互斥选中状态
};
#endif // IMAGEPREVIEWWIDGET_H

